import 'dart:math';
import '../index.dart';

class AddressUtil {


  // 描述信息处理(截取在xxx附近或者靠近以后的信息)
  /// 描述地址信息简化处理
  /// [desc]地址描述信息
  /// [area]地址所在区
  /// [showArea]是否需要展示区
  static String description(String? desc,{String? area, bool? showArea = false}){

    if (desc == null) return '';

    // 先截断区以后的信息
    desc = delete(desc,key: area);

    // 正则匹配 "在XXX附近"文本
    RegExp regex = RegExp(r'在(.+?)附近');
    Match? match = regex.firstMatch(desc);
    if (match != null && match.groupCount >= 1) {
      desc = match.group(1)!;
    }else {
      // 获取靠近以后的位置
      desc = delete(desc,key: '靠近');
    }
    // 去不需要拼接
    return area!=null&&showArea!?area+desc:desc;
  }

  /// 格式化地址，全拼信息
  static String full(String? address,{
    required String? province,
    required String? city,
    required String? area
  }) {

    // 拼接非空且非null的字符串(已经被包含的元素，不参与拼接)
    String temp = [address, area, city, province].fold('', (value, element) {

      if (element != null && element.isNotEmpty) {
        return value.isEmpty ? element
            : value.contains(element) ? value
            : '$element$value';
      }
      return value;
    });
    /// 去除靠近
    return temp.replaceAll('靠近', '');
  }

  /// 格式化地址，去除区县以前的信息，删除'靠近'
  static String format(String? address, String? area) {
    /// 返回空值
    if (address == null) return '';
    if (area != null) {
      /// 截掉area以前所有的字符
      int index = address.indexOf(area);
      if (index >= 0) {
        address = address.substring(index);
      }
    }

    /// 去除靠近
    return address.replaceAll('靠近', '');
  }

  /// 删除地址无用信息
  /// [address]地址信息
  /// [string]要删除的字符
  /// [key]要截断的关键字
  static String delete(String address,{String? string, String? key}) {
    if (string.exStr.isNotEmpty) {
      address = address.replaceAll(string!, '');
    } else {
      if (key.exStr.isNotEmpty) {
        /// 截取省字儿以后的地址信息
        int index = address.indexOf(key.exStr);
        if (index != -1) {
          address = address.substring(index + key!.length);
        }
      }
    }
    return address;
  }

  /// 距离格式化
  static String distance(double distance) {
    // 最小展示0.01km
    double value = distance / 1000.0;
    // 小于10km保留两位小数
    if (value < 10) return '${max(value, 0.01).toStringAsFixed(2)}km';
    // 大于10km小于100km保留1位小数
    if (value < 100) return '${value.toStringAsFixed(1)}km';
    // 大于100km取整数
    return '${value.toInt()}km';
  }

  ///距离格式化保留一位小数
  static String distanceFixed(double distance) {
    String dis = max(distance / 1000.0, 0.01).toStringAsFixed(1).toString();
    if (dis.contains(".0")) {
      return '${dis.replaceAll(".0", "")}km';
    }
    return '${dis}km';
  }
}
